//
//  CAIFileCache.h
//  Runner
//
//  Created by simon on 2021/10/19.
//

//  

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN




@interface CAIFileCache : NSObject

/// 始终使用initWithName:初始化的对象并返回；
+ (instancetype)sharedCache;


/// 初始化对象，并指定使用Archive的方式同步存储对象的时候的文件路径；默认是NSDocumentDirectory路径；
/// @param name 文件夹名称
- (instancetype)initWithName:(nullable NSString *)name;


/// 指定初始化
/// @param name 文件夹名
/// @param rootPath 如果要存在修改的文件目录下，则[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
- (instancetype)initWithName:(nullable NSString *)name rootPath:(NSString *)rootPath;

/**
 *  以PropertyList序列化方式同步存对象，PList对象定义规则如下：
 *  NSNumber、NSString、NSData、NSDate、NSArray、NSDictionary,且他们的子对象也只能是Property List对象，否则会crach；对于超过150Kb的数据，会兜底用archive方式存储；
 */
- (void)setObject:(id)object forKey:(NSString *)key;


/**
 *  以PropertyList序列化方式同步存对象;同上；加密；
 *  如果setObject:forKey和setEncodeCryptObject:forKey:error使用同一个key，会覆盖存储；
 *
 */
- (void)setEncodeCryptObject:(id)object
                      forKey:(NSString *)key
                       error:(NSError * __autoreleasing *)error;


/**
 *  使用Archive的方式同步存储对象，只要对象支持NSCoding，都可以归档。
 *  Property List对象也可以使用archive方式归档，但速度要慢很多，建议当对象肯定为Property List时，使用setObject方法。主要用于序列化存储不支持的对象,复杂对象图对象；
 */
- (void)archiveObject:(id <NSCoding>)object forKey:(NSString *)key;

/// 同上；加密方式；
/// @param object 根对象
/// @param key key
/// @param error 错误信息
- (void)archiveEncodeCryptObject:(id <NSSecureCoding>)object
                          forKey:(NSString *)key
                           error:(NSError * __autoreleasing *)error;

/**
 *  同步取对象，业务层不需要关心归档/序列化方式，统一使用该接口取对象。
 */
- (id)objectForKey:(NSString *)key;


/**
 *  同步取对象，用于解密的。业务层不需要关心归档/序列化方式，需解密的统一使用该接口取对象。
 *  cls:解密返回的根对象类
 *  return:返回需要的根对象
 */
- (id)objectDecodeCryptForKey:(NSString *)key
                expectedClass:(Class)cls
                        error:(NSError * __autoreleasing *)error;




/**
 *  同步删除对象，业务层不需要关心归档/序列化方式，统一使用该接口删除对象。
 */
- (void)removeObjectForKey:(NSString *)key;

@end

NS_ASSUME_NONNULL_END
